/*******************************************************************************
* Author Olivier Grosse : http://codessources.votre-web.com
* Color conversion function
*   to convert HEX, RGB, CMY, CMYK, HSV, HLS colors
* Each function has been implemented in this file
* Just use this syntaxe (with specific format described bottom)
*   <INPUT COLORSPACE>2<OUTPUT COLOR SPACE>
*   Example RGB2CMYK(rgb), HEX2HSV(hex), etc...
*--------------------------------------------------------------------------------
*   Format use and component range:
*		-RGB color 	:	Sring::'rgb(r,g,b)'		with r,g,b [0...255]
*		-Hex color	:	String::'#rrggbb'		with r,g,b [0...9A...F]
*		-CMY color 	:	Array::[c,m,y]			with c,m,y [0...100]
*		-CMYK color :	Array::[c,m,y,k]		with c,m,y,k [0...100]
*		-HSV color	:	Array::[h,s,v]			with s,v [0...100] and h [0...360]
*		-HLS color	:	Array::[h,s,l]			with s,l [0...100] and h [0...360]
*
*  NOTE:	-	HLS for hue/luminescance/saturation
				in french TLS Teinte/luminosite/saturation
*******************************************************************************/

// Hexadecimal caraters
var Hchar='0123456789ABCDEF';

//rgb to ...
function RGB2RGB(rgb) { return rgb; }
function RGB2HEX(rgb)
{
	var resu='#';
	var s=RGB2Array(rgb); 
	for (_k=0;_k<3;_k++) { var n=parseInt(s[_k]); resu+=Hchar.charAt(n>>4)+Hchar.charAt(n&15); }
	return resu;  //format '#rrggbb'
}
function RGB2CMY(rgb)
{
	var s=RGB2Array(rgb);
	for(_k=0; _k<3 ; _k++) { s[_k]=resampleColor(s[_k],255,1); }
	var resu=_RGB2CMY(s[0],s[1],s[2]);
	for(_k=0; _k<3 ; _k++) { resu[_k]=resampleColor(resu[_k],1,100,true); }
	return resu;
}
function RGB2CMYK(rgb)
{
	var s=RGB2Array(rgb);
	for(_k=0; _k<3 ; _k++) { s[_k]=resampleColor(s[_k],255,1); }
	var resu=_RGB2CMYK(s[0],s[1],s[2]);
	for(_k=0; _k<4 ; _k++) { resu[_k]=resampleColor(resu[_k],1,100,true); }
	return resu;
}
function RGB2HSV(rgb)
{
	var s=RGB2Array(rgb);
	for(_k=0; _k<3 ; _k++) { s[_k]=resampleColor(s[_k],255,1); }
	var resu=_RGB2HSV(s[0],s[1],s[2]);
	for(_k=1; _k<3 ; _k++) { resu[_k]=resampleColor(resu[_k],1,100,true); }  // on ne resample pas la composante H !!! _k=1 ...
	resu[0]=Math.round(resu[0]);
	return resu;
}
function RGB2HLS(rgb)
{
	var s=RGB2Array(rgb);
	for(_k=0; _k<3 ; _k++) { s[_k]=resampleColor(s[_k],255,1); }
	var resu=_RGB2HLS(s[0],s[1],s[2]);
	for(_k=1; _k<3 ; _k++) { resu[_k]=resampleColor(resu[_k],1,100,true); }  // on ne resample pas la composante H !!! _k=1 ...
	resu[0]=Math.round(resu[0]);
	return resu;
}
//Hex to ...
function HEX2HEX(hex) { return hex; }
function HEX2RGB(hex)
{
	var resu='rgb(';
	for(_k=0 ; _k<3 ; _k++)
	{
		 if(_k!=0) { resu+=','; }
		 resu+=''+(16*Hchar.indexOf((''+hex.charAt(1+_k*2)).toUpperCase())+Hchar.indexOf((''+hex.charAt(2+_k*2)).toUpperCase()));
	}
	return resu+')';
}
function HEX2CMY(hex) { return RGB2CMY(HEX2RGB(hex)); }
function HEX2CMYK(hex){ return RGB2CMYK(HEX2RGB(hex)); }
function HEX2HSV(hex){ return RGB2HSV(HEX2RGB(hex)); }
function HEX2HLS(hex){ return RGB2HLS(HEX2RGB(hex)); }
//CMYK to ...
function CMYK2CMYK(cmyk) { return cmyk; }
function CMYK2RGB(cmyk)
{
	for(_k=0 ; _k<4 ; _k++) { cmyk[_k]=resampleColor(cmyk[_k],100,1); }
	var tab=_CMYK2RGB(cmyk[0],cmyk[1],cmyk[2],cmyk[3]);
	for(_k=0 ; _k<3 ; _k++) { tab[_k]=resampleColor(tab[_k],1,255,true); }
	return 'rgb('+tab+')';
}
function CMYK2HEX(cmyk){ return RGB2HEX(CMYK2RGB(cmyk)); }
function CMYK2CMY(cmyk){ return RGB2CMY(CMYK2RGB(cmyk)); }
function CMYK2HSV(cmyk){ return RGB2HSV(CMYK2RGB(cmyk)); }
function CMYK2HLS(cmyk){ return RGB2HLS(CMYK2RGB(cmyk)); }
//HLS to ...
function HLS2HLS(hls) { return hls; }
function HLS2RGB(hls)
{
	for(_k=1 ; _k<3 ; _k++) { hls[_k]=resampleColor(hls[_k],100,1); }
	var tab=_HLS2RGB(hls[0],hls[1],hls[2]);
	for(_k=0 ; _k<3 ; _k++) { tab[_k]=resampleColor(tab[_k],1,255,true); }
	tab[0]=Math.round(tab[0]);
	return 'rgb('+tab+')';
}
function HLS2HEX(hls){ return RGB2HEX(HLS2RGB(hls)); }
function HLS2CMY(hls){ return RGB2CMY(HLS2RGB(hls)); }
function HLS2CMYK(hls){ return RGB2CMYK(HLS2RGB(hls)); }
function HLS2HSV(hls){ return RGB2HSV(HLS2RGB(hls)); }
//CMY to ...
function CMY2CMY(cmy) { return cmy; }
function CMY2RGB(cmy)
{
	for(_k=0 ; _k<3 ; _k++) { cmy[_k]=resampleColor(cmy[_k],100,1); }
	var tab=_CMY2RGB(cmy[0],cmy[1],cmy[2]);
	for(_k=0 ; _k<3 ; _k++) { tab[_k]=resampleColor(tab[_k],1,255,true); }
	return 'rgb('+tab+')';
}
function CMY2HEX(cmy){ return RGB2HEX(CMY2RGB(cmy)); }
function CMY2CMYK(cmy){ return RGB2CMYK(CMY2RGB(cmy)); }
function CMY2HSV(cmy){ return RGB2HSV(CMY2RGB(cmy)); }
function CMY2HLS(cmy){ return RGB2HLS(CMY2RGB(cmy)); }
//HSV to ...
function HSV2HSV(hsv) { return hsv; }
function HSV2RGB(hsv)
{
	for(_k=1 ; _k<3 ; _k++) { hsv[_k]=resampleColor(hsv[_k],100,1); }
	var tab=_HSV2RGB(hsv[0],hsv[1],hsv[2]);
	for(_k=0 ; _k<3 ; _k++) { tab[_k]=resampleColor(tab[_k],1,255,true); }
	tab[0]=Math.round(tab[0]);
	return 'rgb('+tab+')';
}
function HSV2HEX(hsv){ return RGB2HEX(HSV2RGB(hsv)); }
function HSV2CMY(hsv){ return RGB2CMY(HSV2RGB(hsv)); }
function HSV2CMYK(hsv){ return RGB2CMYK(HSV2RGB(hsv)); }
function HSV2HLS(hsv){ return RGB2HLS(HSV2RGB(hsv)); }

/*
  resampleColor funtion
  resample the range of a color component in order to be in an other range
   Exemple 1: 129/255  =>  x?/1
     x=resampleColor(129,255,1);
	 //x=0,50588235294117647058823529411765
  If you would an integer output juste specify true for the 4nd arguments
   Exemple 2:
  	 0.5058/1 => y?/255
	 y=resampleColor(0.5058,1,255,true);
	 //y=129
*/
function resampleColor(input,inputRange,outputRange,integer)
{
	 if(integer==null) { integer=false; }
	 if(inputRange==0) { alert('Error; division by 0'); return 0; }
	 if(integer) { return Math.round(input*outputRange/inputRange); }
	 else {  return input*outputRange/inputRange; }
}

/*
   transform rgb string ssinto rgb array
   'rgb(124,234,41)' ==> Array(124,234,41)
*/
function RGB2Array(rgb)
{
   rgb=(''+rgb).replace('rgb(','').replace(')','').replace(/s*/,''); // on suprime 'rgb(' ')' et les eventuels espaces
   return rgb.split(',');
}
